#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include "DHT.h"  //Añadimos la libreria con la cual trabaja el sensor DHT11.

#define DHTPIN 2     // Indicamos el pin donde conectaremos la patilla data de nuestro sensor.
#define DHTTYPE DHT11  //Tipo de sensor a emplear.
DHT dht(DHTPIN, DHTTYPE);
//Configuración Ethernet.
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Ethernet Shield MAC.
byte ip[] = { 192,168,1,177 }; // Ethernet Shield IP.
byte server[] = { 192,168,1,45 }; // Server IP.

EthernetClient client;


char inString[32]; //String con los datos que leemos.
int stringPos = 0; //Contador
boolean startRead = false; //is reading?

//Declaramos los reles.
int rel1Pin = 3;  //Rele calefaccion. 
int rel2Pin = 4; //Rele riego. 

void setup(void) {
  Serial.begin(9600);
  Ethernet.begin(mac, ip); // Inicializamos Ethernet Shield
  Serial.println("Comprobacion sensor DHT11:");
  dht.begin();
  pinMode(rel1Pin, OUTPUT); // Rele calefaccion
  pinMode(rel2Pin, OUTPUT); // Rele riego
  delay(5000); // Esperamos 5 segundos para inicializar el programa.
  
}

void loop(void) {
 float temperature = getTemp(); // Lee la temperatura y la almacena en la base de datos.
 float humedad = getHumedad(); // Lee la humedad y la almacena en la base de datos.
 delay(1000); //Las condiciones climáticas no cambian tan rapido, hay que ajustarlo.
 String pageValueTemp = connectAndReadTemp(); //Nos conectamos al servidor y leemos lo que hay que hacer.
 Serial.println(pageValueTemp); //Imprimimos el resultado.
 String pageValueHum = connectAndReadHum(); //Nos conectamos al servidor y leemos lo que hay que hacer.
 Serial.println(pageValueHum);
 delay(200000); //Cada cuanto tiempo leemos datos y hacemos ajustes.
 }






/*
Función para temperatura.
*/
float getTemp(){
  float t = dht.readTemperature();
  if (isnan(t)) // Funcion que comprueba si son numeros las variables indicadas´. 
  {
    Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son números.
  } else {
    //Mostramos mensaje con el valor actual de temperatura.
    Serial.print("Temperatura: "); 
    Serial.println(t);
    
 
   //Guardamos la Temperatura en Couchdb.
  Serial.println("Connecting...");

  if (client.connect(server, 80)>0) {  // Nos conectamos al servidor Apache.
    client.print("GET /arduino/arduino_sensor.php?type=Celsius&value="); // Enviamos DATA con GET.
    client.print(t);
    client.println(" HTTP/1.0");
    client.println("User-Agent: Arduino 1.0");
    client.println();
    Serial.println("Connected");
  }
  else
  {
    Serial.println("Connection FAIL");
  }
  if (client.connected()) {}
  else {
    Serial.println("Disconnected!");
  }
  client.stop();
  client.flush();
  }
}
/*
Función para humedad.
*/
float getHumedad(){
  float h = dht.readHumidity();
  if (isnan(h)) // Función que comprueba si son numeros las variables indicadas.
  {
    Serial.println("Fallo al leer del sensor DHT"); //Mostramos mensaje de fallo si no son números.
  } else {
    //Mostramos mensaje con valores actuales de humedad.
    Serial.print("Humedad: "); 
    Serial.println(h);
      //Guardamos la Humedad en Couchdb.
  Serial.println("Connecting...");

  if (client.connect(server, 80)>0) {  // Nos conectamos al servidor.
    client.print("GET /arduino/arduino_sensor.php?type=Humedad&value="); // Enviamos DATA con GET.
    client.print(h);
    client.println(" HTTP/1.0");
    client.println("User-Agent: Arduino 1.0");
    client.println();
    Serial.println("Connected");
  }
  else
  {
    Serial.println("Connection FAIL");
  }
  if (client.connected()) {}
  else {
    Serial.println("Disconnected!");
  }
  client.stop();
  client.flush();
  }
}

/*
Funcion para reles de temperatura
*/
String connectAndReadTemp(){
  //Nos conectamos al servidor.

  Serial.println("connecting...");

  //port 80 is typical of a www page
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.print("GET ");
    client.println("http://192.168.1.45/arduino/actuador_temperatura.php HTTP/1.0");
    client.println();

    //Leemos la pagina.
    return readPageTemp(); 

  }else{
    return "connection failed";
  }

}



String readPageTemp(){
  //Leemos la pagina y capturamos todo entre los caracteres "<" y ">"

  stringPos = 0;
  memset( &inString, 0, 32 ); //clear inString memory

  while(true){

    if (client.available()) {
      char c = client.read();

      if (c == '<' ) { //'<' caracter de inicio
        startRead = true; //Preparado para leer 
      }else if(startRead){

        if(c != '>'){ //'>' caracter de fin
          inString[stringPos] = c;
          stringPos ++;
        }else{
          //Nos desconectamos.
          startRead = false;
          client.stop();
          client.flush();
          Serial.println("desconectando.");
          
          int inRel = atoi (inString);
          if (inRel == 1) {
            digitalWrite(rel1Pin, HIGH);
           
            Serial.println("Encendemos calefaccion");
          } else if (inRel == 2) {
            digitalWrite(rel1Pin, LOW);
            
            Serial.println("Apagamos calefaccion");
          }
          return inString;

        }

      }
    }

  }

}

/*
Funcion para reles de humedad
*/
String connectAndReadHum(){
  //Nos conectamos al servidor.

  Serial.println("connecting...");

  //port 80 is typical of a www page
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.print("GET ");
    client.println("http://192.168.1.45/arduino/actuador_humedad.php HTTP/1.0");
    client.println();

    //Leemos la pagina.
    return readPageHum(); 

  }else{
    return "connection failed";
  }

}



String readPageHum(){
  //Leemos la pagina y capturamos todo entre los caracteres "<" y ">"

  stringPos = 0;
  memset( &inString, 0, 32 ); //clear inString memory

  while(true){

    if (client.available()) {
      char c = client.read();

      if (c == '<' ) { //'<' caracter de inicio.
        startRead = true; //Preparado para leer. 
      }else if(startRead){

        if(c != '>'){ //'>' caracter de fin.
          inString[stringPos] = c;
          stringPos ++;
        }else{
          //Nos desconectamos.
          startRead = false;
          client.stop();
          client.flush();
          Serial.println("desconectando.");
          
          int inRel = atoi (inString);
          if (inRel == 3) {
            digitalWrite(rel2Pin, HIGH);
            
            Serial.println("Encendemos riego");
          } else if (inRel == 4) {
            digitalWrite(rel2Pin, LOW);
        
            Serial.println("Apagamos riego");
          }
          return inString;

        }

      }
    }

  }

}

